#类定义实例
# class Teacher():
#     name = 'aaa' # 类属性
#     """
#     定义类的语法：
#     class 类名（首字母大写）
#     """
#     def __init__(self,name,age,sex): # name,age,sex 实例属性
#         """
#         __init__：实例属性
#         name: 姓名
#         age：年龄
#         sex：性别
#         """
#         self.name = name
#         self.age = age
#         self.sex = sex
#         """
#         在类里面，self表示对象可以调用的属性、方法
#         """
#     def course(self):
#         print("course")
#         print("老师在给学生判卷")
#         return 222
"""
t1 = Teacher(name = "关博文",age = 19,sex = "女")
# 打印一下t1的名称
# print(t1.name)
# 打印一下t1对象的年龄
# print(t1.age)
#t1对象的性别
# print(t1.sex)
#t1对象的地址
"""
"""
print(t1.address)
"""
"""
# 给t1对象加一个地址属性
t1.address = "辽宁省沈阳市"
# print(t1.address)
t2 = Teacher(name = "刘涵文",age = 69,sex = "中性")
# print(t2.name)
# print(t2.age)
# print(t2.sex)
# print(t2.address)  # 如果你想加这个类里不存在的对象，一定要先定义后使用
# print(t1) # 直接打印的是这个对象地址值
# print(t2)

# print(isinstance(t1,Teacher)) # t1对象是否是Teacher类里的
print(t1.course())
"""
# 类的属性方法
#  调用类的属性
"""
print(Teacher.__dict__) # 打印类的全部属性
"""
# 调用类的属性
"""
print(Teacher.name)
"""
# 类调用类中带self参数的方法
"""
print(Teacher.course) # <function Teacher.course at 0x013CE108>
"""
# 下面可以调用，但是不规范。  需要用实例化的对象去调用它
"""
aaa = Teacher.course(111)
print(aaa)
"""
# 正常的规范调用：要用实例化的对象，去调用类的方法
"""
t1 = Teacher("李禹浩",29,"女")
t1.course()
"""
# 不存在的属性或者方法会报错
"""
# print(Teacher.address)
"""
# 修改类属性的值
"""
print(Teacher.name) # aaa
Teacher.name = "甜蜜蜜"
print(Teacher.name)
"""
# 添加的属性
"""
Teacher.play = "LOL" # 联盟
print(Teacher.play)
print(Teacher.__dict__)
"""
# 删除类的属性
"""
del Teacher.play
"""
# print(Teacher.play) # 再次打印就会报错，因为已经把类属性删掉了

# 对象的使用
class Teacher:
    name = "关博文" # 类属性
    age = 18 # 类属性
    sex = '男'# 类属性
    """
    因为没有__init__实例属性，所以都是找类的属性
    """
    def course(self):
        print(self)
        print('course')
        return 222
#通过teacher类生成对象
"""
t1 = Teacher()
t2 = Teacher()
t3 = Teacher()
# print(t1,t2,t3)
print(t1.__dict__)
print(t1.name) # 走的是类属性
print(t2.name) # 走的是类属性
print(t3.name) # 走的是类属性

print(Teacher.__dict__)
print("==============")
print(t1.__dict__)
# print(t2.__dict__)
# print(t3.__dict__)

# 类有return
aa = Teacher.course(111)
print(aa)

# 新增类对象的属性
# 要遵循先定义，后使用
t1.address = "辽宁沈阳"
print(t1.address)

#删除类对象的属性
del t1.address
# print(t1.address) # AttributeError: 'Teacher' object has no attribute 'address'
"""
# 生成对象自动添加属性方法
class Teacher1():
    # 相同的特征/属性/变量
    school = 'laice'
    def __init__(self,name,age,sex,address):
        self.name = name
        self.age = age
        self.sex = sex
        self.address = address
        # self.address = "辽宁沈阳"
    #函数/方法/技能
    def course(self):
        # print('course')
        # print(self.name)
        print(f"大家好，我的姓名是:{self.name}，我的年龄是：{self.age}，我的性别是：{self.sex}，我的家乡是：{self.address}")
        return 111
"""
t1 = Teacher1(name = "刘涵文",age = 99,sex = "中性",address="辽宁鞍山")
t1.course()

t2 = Teacher1(name = "关博文",age = 199,sex = "未知",address="辽宁朝阳")
t2.course()

# 属性查找顺序：优先查找对象本身的属性，没有则去类里找类的属性
print(t1.school) # laice

# 类和对象的属性共享关系
print(t1.school)
print(Teacher1.school)

# 调用course方法，只能是类对象/实例对象 去调用
t1.course()
"""


# 类的属性变化对类和对象的影响
# 类的属性变化
# 类改类的属性
Teacher1.yyy = 333
# print(Teacher1.yyy) # 只是临时加了一个，但是后续的代码：类本身、实例对象都可以调用这个yyy
# 对象改类的属性（改不了），实际上是自己添加类一个独有的属性
t1 = Teacher1(name = "关博文",age = 19,sex = '女',address='中国')
t1.yyy = 222 # 只是临时加了一个，并且其他的类对象是访问不到的

# 类的属性给对象调用
# 对象已经有了yyy属性的会优先考虑自己的
# print(id(t1.yyy),t1.yyy)

# 对象调用类中带self参数的方法
# 对象调用类的方法 不需要传入参数
# t1.course()
t2 = Teacher1(name = '刘文瀚',age = 99,sex = '中性',address='地球')
# t2.course()

# 类调用方法必须传入self参数对应的对象,因为方法里面需要使用这个self对象
Teacher1.course(t1) # t1对象调用course这个方法
Teacher1.course(t2) # t2对象调用course这个方法
t3 = Teacher1(name = '李禹浩',age = 199,sex = '女',address='辽宁')
# Teacher1.course(t4) # NameError: name 't4' is not defined
Teacher1.course(t3)
















